package com.xingfei.blog.common.utils;

import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;

/**
 * Created with IntelliJ IDEA.
 * 图片处理类.
 * @author: chenxingfei
 * @time: 2017/2/7  15:39
 * To change this template use File | Settings | File Templates.
 */
public class ImageHelper {
	public static void main(String[] args){
		String srcImgPath = "d:/temp/222_111.png";
		String outImgPath = "d:/temp/1464872065722_240x240.png";
		int new_w = 240;
		int new_h = 240;
		try {
			cutCenterImage(srcImgPath, outImgPath, new_w, new_h);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	/* 
     * 根据尺寸图片居中裁剪 
     */  
     public static void cutCenterImage(String src,String dest,int w,int h) throws IOException{   
    	 synchronized(ImageHelper.class){
    		 Iterator iterator = ImageIO.getImageReadersByFormatName("jpg");   
    		 ImageReader reader = (ImageReader)iterator.next();   
    		 InputStream in=new FileInputStream(src);  
    		 ImageInputStream iis = ImageIO.createImageInputStream(in);   
    		 reader.setInput(iis, true);   
    		 ImageReadParam param = reader.getDefaultReadParam();   
    		 int imageIndex = 0;   
    		 int x = (reader.getWidth(imageIndex)-w)/2;
    		 int y = (reader.getHeight(imageIndex)-h)/2;
    		 x = x<0 ? 0 : x;
    		 y = y<0 ? 0 : y;
    		 Rectangle rect = new Rectangle(x, y, w, h);    
    		 param.setSourceRegion(rect);   
    		 BufferedImage bi = reader.read(0,param);     
    		 ImageIO.write(bi, "jpg", new File(dest));             
    	 }
     }  
     
     /* 
     * 图片裁剪二分之一 
     */  
     public static void cutHalfImage(String src,String dest) throws IOException{   
         Iterator iterator = ImageIO.getImageReadersByFormatName("jpg");   
         ImageReader reader = (ImageReader)iterator.next();   
         InputStream in=new FileInputStream(src);  
         ImageInputStream iis = ImageIO.createImageInputStream(in);   
         reader.setInput(iis, true);   
         ImageReadParam param = reader.getDefaultReadParam();   
         int imageIndex = 0;   
         int width = reader.getWidth(imageIndex)/2;   
         int height = reader.getHeight(imageIndex)/2;   
         Rectangle rect = new Rectangle(width/2, height/2, width, height);   
         param.setSourceRegion(rect);   
         BufferedImage bi = reader.read(0,param);     
         ImageIO.write(bi, "jpg", new File(dest));     
     }  
    /* 
     * 图片裁剪通用接口 
     */  
  
    public static void cutImage(String src,String dest,int x,int y,int w,int h) throws IOException{   
           Iterator iterator = ImageIO.getImageReadersByFormatName("jpg");   
           ImageReader reader = (ImageReader)iterator.next();   
           InputStream in=new FileInputStream(src);  
           ImageInputStream iis = ImageIO.createImageInputStream(in);   
           reader.setInput(iis, true);   
           ImageReadParam param = reader.getDefaultReadParam();   
           Rectangle rect = new Rectangle(x, y, w,h);    
           param.setSourceRegion(rect);   
           BufferedImage bi = reader.read(0,param);     
           ImageIO.write(bi, "jpg", new File(dest));             
  
    }   
    /* 
     * 图片缩放 
     */  
    public static void zoomImage(String src,String dest,int w,int h) throws Exception {  
        double wr=0,hr=0;  
        File srcFile = new File(src);  
        File destFile = new File(dest);  
        BufferedImage bufImg = ImageIO.read(srcFile);  
        Image Itemp = bufImg.getScaledInstance(w, h, bufImg.SCALE_SMOOTH);  
        wr=w*1.0/bufImg.getWidth();  
        hr=h*1.0 / bufImg.getHeight();  
        AffineTransformOp ato = new AffineTransformOp(AffineTransform.getScaleInstance(wr, hr), null);  
        Itemp = ato.filter(bufImg, null);  
        try {  
            ImageIO.write((BufferedImage) Itemp,dest.substring(dest.lastIndexOf(".")+1), destFile);  
        } catch (Exception ex) {  
            ex.printStackTrace();  
        }  
          
    }  
}
